www.gusucode.com > VC++ 网络在线考试系统源码-源码程序 > VC++ 网络在线考试系统源码-源码程序/code/组件/EXAM/CaculateScore.cpp

    //Download by http://www.NewXing.com
// CaculateScore.cpp : Implementation of CCaculateScore
#include "stdafx.h"
#include "EXAM.h"
#include "CaculateScore.h"

//#import "QuestionInfo.tlb"



/////////////////////////////////////////////////////////////////////////////
// CCaculateScore

HRESULT CCaculateScore::Activate()
{
	HRESULT hr = GetObjectContext(&m_spObjectContext);
	if (SUCCEEDED(hr))
		return S_OK;
	return hr;
} 

BOOL CCaculateScore::CanBePooled()
{
	return FALSE;
} 

void CCaculateScore::Deactivate()
{
	m_spObjectContext.Release();
} 


STDMETHODIMP CCaculateScore::get_Score(long *pVal)
{
	// TODO: Add your implementation code here
	*pVal=m_nScore;

	return S_OK;
}

STDMETHODIMP CCaculateScore::put_Score(long newVal)
{
	// TODO: Add your implementation code here
	m_nScore=newVal;
	return S_OK;
}

STDMETHODIMP CCaculateScore::CaculateScore(int x_nSID, BSTR *x_Success)
{
	// TODO: Add your implementation code here
	try
	{
		if (FAILED(pConn.CreateInstance(__uuidof(Connection))))
		{
			*x_Success = ::SysAllocString(L"Couldn't create connection component!");
			return S_OK;
		}

		if (FAILED(pConn->Open("Provider=MSDASQL.1;Password=;Persist Security Info=True;User ID=SA;Data Source=EXAM;Initial Catalog=EXAM","","",-1)))
		{
			*x_Success = ::SysAllocString(L"Couldn't open connection!");
			return S_OK;
		}

		char m_strBuf[10];
		char m_strSql[256];
		CComBSTR m_bstrSql;
		CComVariant m_varNum;
		CComVariant m_varData;
		strcpy(m_strSql,"select * from testprocdetail where SID=");
		_itoa(x_nSID, m_strBuf, 10);
		strcat(m_strSql, m_strBuf);
		pRs = pConn->Execute(m_strSql, &m_varNum, -1);
		if (pRs->ADOEOF)
		{
			*x_Success = ::SysAllocString(L"No such records for the specified student!");
			return S_OK;
		}
		CComVariant m_varData1;
		pRs->MoveFirst();
		int i=1;
		m_nScore=0;
		while(!pRs->ADOEOF)
		{
			char m_strFieldName[20];
			int m_iQtype,m_iQID;
			short m_iAnswer;
			strcpy(m_strFieldName, "QTYPE");
			pRs->Fields->GetItem(m_strFieldName)->get_Value(&m_varData);
			if(m_varData.vt != VT_NULL)
			{
				m_iQtype=m_varData.iVal;
				strcpy(m_strFieldName,"Q");
				pRs->Fields->GetItem(m_strFieldName)->get_Value(&m_varData);
				if (m_varData.vt != NULL)
				{
					m_iQID=m_varData.iVal;
					if(!::CoInitialize((LPVOID)0))
					{
						*x_Success=::SysAllocString(L"Initianlize failed");
						return S_OK;
					}
					if(FAILED(m_pQuestion.CreateInstance(__uuidof(Question))))
					{
						*x_Success=::SysAllocString(L"Failed in creating Instance");
						return S_OK;
					}
					m_pQuestion->GetQuestion(m_iQtype,m_iQID);
					m_pQuestion->get_Answer(&m_iAnswer);
					strcpy(m_strFieldName, "A");
					pRs->Fields->GetItem(m_strFieldName)->get_Value(&m_varData);
					if(m_varData.vt != VT_NULL)
					{
						if(m_varData.iVal == m_iAnswer )
						{
							m_nScore += 2;
						}
					}

				}
				else
				{
					*x_Success=::SysAllocString(L"one question no answer.");
				}
			}

				pRs->MoveNext();
		}
		strcpy(m_strSql, "INSERT INTO TESTRESULT(SID,TESTDATE,SCORE) VALUES(" );
		_itoa(x_nSID, m_strBuf, 10);
		strcat(m_strSql, m_strBuf);
		strcat(m_strSql, ",GETDATE(),");
		_itoa(m_nScore, m_strBuf, 10);
		strcat(m_strSql, m_strBuf);
		strcat(m_strSql, ")");
		pConn->Execute(m_strSql, &m_varNum, -1);
		strcpy(m_strSql, "UPDATE TESTPROC SET FINISHFLAG='Y' WHERE SID=");
		_itoa(x_nSID, m_strBuf, 10);
		strcat(m_strSql, m_strBuf);
		pConn->Execute(m_strSql, &m_varNum, -1);
		pConn->Close();
		m_spObjectContext->SetComplete();
		*x_Success = ::SysAllocString(L"Successfully!");
		::CoUninitialize();
	}
	catch(...)
	{
		*x_Success = ::SysAllocString(L"Error occurs!");
		if (pConn != NULL)
		{
			pConn->Close();
		}
		m_spObjectContext->SetAbort();
		::CoUninitialize();
		return S_OK;
	}
	::CoUninitialize();
	return S_OK;
}

STDMETHODIMP CCaculateScore::GetScore(int x_nSID, int *x_nScore)
{
	// TODO: Add your implementation code here
	if (FAILED(pConn.CreateInstance(__uuidof(Connection))))
	{
		*x_nScore = 0;
		return S_OK;
	}

	if (FAILED(pConn->Open("Provider=MSDASQL.1;Password=;Persist Security Info=True;User ID=SA;Data Source=EXAM;Initial Catalog=EXAM","","",-1)))
	{
		*x_nScore = 0;
		return S_OK;
	}

	char m_strBuf[10];
	_itoa(x_nSID, m_strBuf, 10);
	
	CComBSTR m_bstrSql;
	m_bstrSql.Append("SELECT SCORE FROM TESTRESULT WHERE SID=");
	m_bstrSql.Append(m_strBuf);

	_bstr_t m_bstrResult(m_bstrSql,FALSE);
	

	CComVariant m_varNum;

	pRs = pConn->Execute(m_bstrResult, &m_varNum, -1);

	if (pRs->ADOEOF)
	{
		*x_nScore = 0;
		return S_OK;
	}

	CComVariant m_varData;
	pRs->GetFields()->GetItem("SCORE")->get_Value(&m_varData);
	
	
	*x_nScore = m_varData.iVal;

	pRs->Close();
	pConn->Close();
	return S_OK;
}